home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 73
/
PCMania CD73_1.iso
/
pcmania
/
projue73
/
Msoft
/
073WIN95.c
next >
Wrap
C/C++ Source or Header
|
1998-09-27
|
6KB
|
260 lines
/****************************************************\
* 073WIN95.C *
* Archivo con las funciones obligatorias *
* GDI - LAS REGIONES *
* I±aki Otero. Villanueva de la Ca±ada, 1998. *
\****************************************************/
#define STRICT
#include "073WIN95.H"
/*-------------------------- HANDLES Y VARIABLES ---*/
char Aplicacion[] = "REGIONES" ;
// Para almacenar las dimensiones
// del ßrea cliente de nuestra ventana
int areaclix, areacliy ;
/*--------------- FUNCION PRINCIPAL DEL PROGRAMA ---*/
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg ;
HWND hwnd ;
WNDCLASSEX wcx ;
wcx.cbSize= sizeof(WNDCLASSEX) ;
wcx.style = CS_HREDRAW | CS_VREDRAW ;
wcx.lpfnWndProc = WinProc ;
wcx.cbClsExtra = 0 ;
wcx.cbWndExtra = 0 ;
wcx.hInstance = hInstance ;
wcx.hIcon = LoadIcon(NULL, IDI_WINLOGO) ;
wcx.hCursor = LoadCursor(NULL, IDC_ARROW) ;
wcx.hbrBackground = (HBRUSH)
GetStockObject(WHITE_BRUSH);
wcx.lpszMenuName = Aplicacion ;
wcx.lpszClassName = Aplicacion ;
wcx.hIconSm = LoadIcon(NULL, IDI_WINLOGO) ;
if(!RegisterClassEx(&wcx)) return (FALSE) ;
hwnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
Aplicacion, Aplicacion,
WS_OVERLAPPEDWINDOW,
64, 64, 512, 352,
NULL, NULL, hInstance, NULL);
if(!hwnd) return (FALSE) ;
ShowWindow(hwnd, nCmdShow) ;
UpdateWindow(hwnd) ;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}
return (msg.wParam) ;
}
/*--------- FUNCION DEL PROCEDIMIENTO DE VENTANA ---*/
long CALLBACK WinProc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
HMENU hmenu ;
PAINTSTRUCT ps ;
int respuesta ;
static int opcion = IDM_RECTREGION ;
switch(message)
{
case WM_COMMAND:
hmenu = GetMenu (hwnd) ;
switch(LOWORD(wParam))
{
case IDM_RECTREGION:
case IDM_ROUNDRECTREGION:
CheckMenuItem(hmenu,
opcion, MF_UNCHECKED) ;
opcion = LOWORD(wParam) ;
CheckMenuItem(hmenu,
opcion, MF_CHECKED) ;
InvalidateRect(hwnd, NULL, TRUE) ;
return 0 ;
case IDM_SALIR:
respuesta = MessageBoxEx( hwnd,
"┐Desea abandonar el programa?",
"SALIR",
MB_YESNO | MB_ICONQUESTION,
LANG_ENGLISH ) ;
if(respuesta == IDYES)
{
DestroyWindow(hwnd) ;
}
break ;
}
break ;
// Dimensiones de la ventana
case WM_SIZE:
// Tomamos las dimensiones del
// ßrea cliente de nuestra ventana
areaclix = LOWORD (lParam) ;
areacliy = HIWORD (lParam) ;
return 0 ;
case WM_PAINT:
BeginPaint(hwnd, &ps) ;
// Ejecutamos los ejemplos en fuci≤n de
// la opci≤n elegida en el men· de persiana.
switch(opcion)
{
case IDM_RECTREGION:
RgnRect(hwnd) ;
break ;
case IDM_ROUNDRECTREGION:
RgnRoundRect(hwnd) ;
break ;
}
EndPaint(hwnd, &ps) ;
break ;
case WM_DESTROY:
PostQuitMessage(0) ;
break ;
default:
return DefWindowProc(hwnd, message,
wParam, lParam) ;
}
return 0 ;
}
/*- FUNCIONES QUE PONEN LOS EJEMPLOS EN PANTALLA ---*/
// Ejemplo de CreateRectRgn, CreateRectRgnIndirect y
// FillRgn
void RgnRect(HWND hwnd)
{
HRGN hrgn1, hrgn2 ;
HDC hdc ;
COLORREF rgb ;
HBRUSH hbrush ;
RECT rect1 ;
int ax, ay ;
// dividimos el ßrea cliente por cinco
ax = areaclix / 5 ;
ay = areacliy / 5 ;
// Estructura RECT
rect1.left = ax * 3 ;
rect1.top = ay ;
rect1.right = ax * 4 ;
rect1.bottom = ay * 4 ;
// Creamos la brocha rayada
rgb = RGB(255, 0, 0) ; // Rojo
hbrush = CreateHatchBrush(HS_BDIAGONAL, rgb) ;
// Tomamos el contexto de dispositivo
hdc = GetDC(hwnd) ;
// Regi≤n rectangular izquierda
hrgn1 = CreateRectRgn(ax, ay, ax * 2, ay * 4) ;
// Regi≤n rectangular derecha
hrgn2 = CreateRectRgnIndirect(&rect1) ;
// Pintamos las regiones con rayas diagonales
// cruzadas rojas
FillRgn(hdc, hrgn1, hbrush) ;
FillRgn(hdc, hrgn2, hbrush) ;
// Eliminamos el contexto de dispositivo
ReleaseDC (hwnd, hdc) ;
// Eliminamos los objetos GDI
DeleteObject(hbrush) ;
DeleteObject(hrgn1) ;
DeleteObject(hrgn2) ;
}
// Ejemplo de CreateRoundRectRgn, FillRgn e InvertRgn
void RgnRoundRect(HWND hwnd)
{
HRGN hrgn1, hrgn2 ;
HDC hdc ;
COLORREF rgb ;
HBRUSH hbrush ;
int ax, ay ;
// dividimos el ßrea cliente por cinco
ax = areaclix / 5 ;
ay = areacliy / 5 ;
// Creamos la brocha rayada
rgb = RGB( 0, 0, 255) ; // Azul
hbrush = CreateHatchBrush(HS_DIAGCROSS, rgb) ;
// Tomamos el contexto de dispositivo
hdc = GetDC(hwnd) ;
// Regi≤n rectangular redondeada izquierda
hrgn1 = CreateRoundRectRgn(ax, ay, ax * 2, ay * 4,
ax / 3, ay / 3);
// Regi≤n rectangular redondeada derecha
hrgn2 = CreateRoundRectRgn(ax * 3, ay, ax * 4,
ay * 4, ax / 3, ay / 3);
// Pintamos ambas regiones
// con rayas diagonales verdes
FillRgn(hdc, hrgn1, hbrush) ;
FillRgn(hdc, hrgn2, hbrush) ;
// Invertimos la region derecha
InvertRgn(hdc, hrgn2) ;
// Eliminamos el contexto de dispositivo
ReleaseDC (hwnd, hdc) ;
// Eliminamos los objetos GDI
DeleteObject(hbrush) ;
DeleteObject(hrgn1) ;
DeleteObject(hrgn2) ;
}
/*------------------------------ FIN DEL ARCHIVO ---*/